package com.pine.sunshineelder.staff.service.impl;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageInfo;
import com.pine.sunshineelder.common.StringHelper;
import com.pine.sunshineelder.common.dao.AccountDao;
import com.pine.sunshineelder.common.dao.StaffDao;
import com.pine.sunshineelder.common.dto.QueryResult;
import com.pine.sunshineelder.common.entity.AccountEntity;
import com.pine.sunshineelder.common.entity.StaffEntity;
import com.pine.sunshineelder.common.exception.ThisSystemException;
import com.pine.sunshineelder.common.validator.ValidateHelper;
import com.pine.sunshineelder.staff.ao.StaffAddAo;
import com.pine.sunshineelder.staff.service.StaffService;

@Service
public class StaffServiceImpl implements StaffService, StringHelper {
	@Autowired
	private StaffDao sdao;
	@Autowired
	private AccountDao adao;

	@Override
	public StaffEntity addStaff(StaffAddAo ao) throws Exception {
		// 验证清理参数
		String title = trimAsNull(ao.getTitle());// 职称
		String remark = trimAsNull(ao.getRemark());// 备注
		String introUrl = trimAsNull(ao.getIntroUrl());// 详情
		String wechat = trimAsNull(ao.getWechat());// 微信
		String image = trimAsNull(ao.getImage());// 照片
		String createUserId=trimAsNull(ao.getCreateUserId());//创建人id
		// 2.业务处理
		if (adao.selectExist("account", ao.getAccount())) {
			throw new ThisSystemException("acount.exists", "账号已存在");
		}
		if (sdao.selectExist("no", ao.getNo())) {
			throw new ThisSystemException("no.exists", "编号已存在");
		}
		// 3.结果组装
		StaffEntity ste = new StaffEntity();
		String id = uuid();
		ste.setId(id);
		ste.setNo(ao.getNo());
		ste.setTitle(title);
		ste.setRemark(remark);
		ste.setIntroUrl(introUrl);
		ste.setMale(ao.getMale());
		ste.setWorkPhone(ao.getWorkPhone());
		ste.setPrivatePhone(ao.getPrivatePhone());
		ste.setEmployedDate(ao.getEmployedDate());
		ste.setEmail(ao.getEmail());
		ste.setWechat(wechat);
		ste.setAddress(ao.getAddress());
		ste.setImage(image);
		ste.setIdCard(ao.getIdCard());
		ste.setBirthday(ao.getBirthday());
		
		AccountEntity ae = new AccountEntity();
		ae.setId(id);
		ae.setName(ao.getName());
		ae.setAccount(ao.getAccount());
		ae.setPassword("888888");
		ae.setCreateUserId(ao.getCreateUserId());
		ae.setFlag(0);
		ae.setRole(ao.getRole());

		adao.insert(ae);
		sdao.insert(ste);

		return ste;
	}

	@Override
	public void deleteStaff(String id) throws Exception {
		// 验证
		id = ValidateHelper.$("id", id);
		// 执行业务逻辑
		adao.delete(id);

	}

	@Override
	public StaffEntity modeifyStaff(String id, Map<String, String> map) throws Exception {
		// 验证参数
		id = ValidateHelper.$("id", id);
		// 传入id
		StaffEntity ste = sdao.selectById(id);
		if (ste == null) {
			throw new ThisSystemException("id.not-exisits", "非法id");
		}
		Map<String, Object> supdateMap = new HashMap<String, Object>();
		Map<String, Object> aupdateMap = new HashMap<String, Object>();

		// 账户
		String newAccount = trimAsNull(map.get("account"));
		if (newAccount != null) {
			if (!Objects.equals(ste.getAccount(), newAccount)) {
				ValidateHelper.assertLength("账号", newAccount, 6, 16);
				ValidateHelper.assertMatch("账号只能是字母和数字组成的6-16位", newAccount, "[0-9a-zA-Z]{6,16}");
				// 2.2 账号是否存在
				if (adao.selectExist("account", newAccount)) {
					throw new ThisSystemException("acount.exists", "账号已存在");
				}
				// 修改旧对象
				ste.setAccount(newAccount);
				// 保存要修改的字段
				aupdateMap.put("account", newAccount);
			}
		}
		// 名字
		String newName = trimAsNull(map.get("name"));
		if (newName != null) {
			if (!Objects.equals(ste.getName(), newName)) {
				ValidateHelper.assertLength("名字", newName, 2, 16);
				ValidateHelper.assertMatch("名字必须是中文2-16位", newName, "[\u4e00-\u9fa5·]{2,16}");
				ste.setName(newName);
				aupdateMap.put("name", newName);
			}
		}

		// no员工编号
		String newno = trimAsNull(map.get("no"));
		if (newno != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getNo(), newno)) {
				// 修改旧对象
				ste.setNo(newno);
				// 保存要修改的字段
				supdateMap.put("no", newno);
			}
		}

		// 职称title
		String newtitle = trimAsNull(map.get("title"));
		if (newtitle != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getTitle(), newtitle)) {
				// 修改旧对象
				ste.setTitle(newtitle);
				// 保存要修改的字段
				supdateMap.put("title", newtitle);
			}
		}
		// 备注remark
		String newremark = trimAsNull(map.get("remark"));
		if (newtitle != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getRemark(), newremark)) {
				// 修改旧对象
				ste.setRemark(newremark);
				// 保存要修改的字段
				supdateMap.put("remark", newremark);
			}
		}
		// 详情introUrl
		String newintroUrl = trimAsNull(map.get("introUrl"));
		if (newtitle != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getIntroUrl(), newintroUrl)) {
				// 修改旧对象
				ste.setIntroUrl(newintroUrl);
				// 保存要修改的字段
				supdateMap.put("introUrl", newintroUrl);
			}
		}
		// 性别male
		Integer newmale = parseInt(map.get("male"), null);
		if (newmale != null) {
			// 修改不同内容
			if (ste.getMale() != newmale) {
				// 修改旧对象
				ste.setMale(newmale);
				// 保存要修改的字段
				supdateMap.put("male", newmale);
			}
		}
		// 工作电话workPhone
		String newworkPhone = trimAsNull(map.get("workPhone"));
		if (newtitle != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getWorkPhone(), newworkPhone)) {
				// 修改旧对象
				ste.setWorkPhone(newworkPhone);
				// 保存要修改的字段
				supdateMap.put("workPhone", newworkPhone);
			}
		}
		// 私人电话privatePhone
		String newprivatePhone = trimAsNull(map.get("privatePhone"));
		if (newprivatePhone != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getPrivatePhone(), newprivatePhone)) {
				// 修改旧对象
				ste.setPrivatePhone(newprivatePhone);
				// 保存要修改的字段
				supdateMap.put("privatePhone", newprivatePhone);
			}
		}
		// 入职时间employedDateW
		String newemployedDate = map.get("employedDate");
		if (newemployedDate != null) {
			LocalDate employ = LocalDate.parse(newemployedDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
			// 修改不同内容
			if (employ.compareTo(ste.getEmployedDate()) != 0) {

				// 修改旧对象
				ste.setEmployedDate(employ);
				// 保存要修改的字段
				supdateMap.put("employedDate", employ);
			}
		}
		// 离职时间leaveDate
		String newleaveDate = map.get("leaveDate");
		if (newleaveDate != null) {
			LocalDate leave = LocalDate.parse(newleaveDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
			// 修改不同内容
			if (leave.compareTo(ste.getLeaveDate()) != 0) {
				// 修改旧对象
				ste.setLeaveDate(leave);
				// 保存要修改的字段
				supdateMap.put("leaveDate", leave);
			}
		}
		// 电子邮箱email
		String newemail = trimAsNull(map.get("email"));
		if (newemail != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getEmail(), newemail)) {
				// 修改旧对象
				ste.setEmail(newemail);
				// 保存要修改的字段
				supdateMap.put("email", newemail);
			}
		}
		// 微信wechat
		String newwechat = trimAsNull(map.get("wechat"));
		if (newwechat != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getWechat(), newwechat)) {
				// 修改旧对象
				ste.setWechat(newwechat);
				// 保存要修改的字段
				supdateMap.put("wechat", newwechat);
			}
		}
		// 家庭地址address
		String newaddress = trimAsNull(map.get("address"));
		if (newaddress != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getAddress(), newaddress)) {
				// 修改旧对象
				ste.setAddress(newaddress);
				// 保存要修改的字段
				supdateMap.put("address", newaddress);
			}
		}
		// 照片image
		String newimage = trimAsNull(map.get("image"));
		if (newimage != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getImage(), newimage)) {
				// 修改旧对象
				ste.setImage(newimage);
				// 保存要修改的字段
				supdateMap.put("image", newimage);
			}
		}
		// 身份证号idCard
		String newidCard = trimAsNull(map.get("idCard"));
		if (newidCard != null) {
			// 修改不同内容
			if (!Objects.equals(ste.getIdCard(), newidCard)) {
				// 修改旧对象
				ste.setIdCard(newidCard);
				// 保存要修改的字段
				supdateMap.put("idCard", newidCard);
			}
		}
		// 出生日期birthday
		String newbirthday = map.get("birthday");
		if (newbirthday != null) {
			LocalDate birthday = LocalDate.parse(newbirthday, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
			// 修改不同内容
			if (ste.getBirthday().compareTo(birthday) != 0) {
				// 修改旧对象
				ste.setBirthday(birthday);
				// 保存要修改的字段
				supdateMap.put("birthday", birthday);
			}
		}

		// 进行实际的修改
		if (!aupdateMap.isEmpty()) {
			adao.update(id, aupdateMap);
		}
		if (!supdateMap.isEmpty()) {
			sdao.update(id, supdateMap);
		}

		return ste;
	}

	@Override
	public StaffEntity queryById(String id) throws Exception {
		// 验证清理参数
		id = ValidateHelper.$("id", id);
		// 执行业务逻辑
		StaffEntity se = sdao.selectById(id);
		if (se == null) {
			throw new ThisSystemException("id.not-exisits", "非法id");
		}
		return se;
	}

	@Override
	public QueryResult queryBykey(String key, Integer pageNo, Integer pageSize) throws Exception {
		key = trimAsNull(key);
		if (key != null) {
			// 字符串的拼接，代表前后的数据不限
			key = "%" + key + "%";
		}
		if (pageNo == null) {
			pageNo = 1;
		}
		if (pageSize == null) {
			pageSize = 10;
		}
		List<StaffEntity> rows = sdao.selectByKey(key, pageNo, pageSize);
		
		PageInfo pageInfo = new PageInfo(rows);
		
		int totalRows = (int) pageInfo.getTotal();
		
		QueryResult result = new QueryResult();
		
		result.setPageNo(pageNo);
		
		result.setPageSize(pageSize);
		
		result.setTotalRows(totalRows);
		
		result.setRows(rows);

		return result;
	}

	@Override
	public StaffEntity queryByRole(String role) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

}
